package main

import (
	"fmt"
	"strconv"
	"strings"
)

/*
定义一个初始值：
username = "root"
passwd = "123456
balance = 1000
实现一个简易的atm存取款系统
1、登录成功才能加入系统

	选择 ；
		1.存钱
		2.取钱 --注意取钱数额不能大于它的余额
		3.余额
		4.退出系统

2、登录失败有三次重试机会，不然退出系统
功能封装为函数
*/
func main() {
	//登录成功后加入atm系统,负责退出系统
	if login() {
		fmt.Println("登录成功,进入atm系统")
		atm()
	} else {
		fmt.Println("登录失败")
	}
}

// 登录
func login() bool {
	var name, passwd string
	for i := 0; i < 3; i++ {
		fmt.Print("请输入用户名:")
		fmt.Scan(&name)
		fmt.Print("请输入密码:")
		fmt.Scan(&passwd)
		if name == "root" && passwd == "123456" {
			return true
		} else {
			fmt.Println("用户名或密码错误！！")
		}
	}
	//输入账户密码错误超三次，登录失败
	return false
}

// atm系统
func atm() {
	var n float64
	n = 1000
	balance := &n  //账户余额
	var choice int //存取操作的序号
	for {
		fmt.Println("本系统有以下操作：\n1、存钱 \n2、取钱\n3、查询余额 \n4、退出系统 ")
		fmt.Print("请输入你要进行的操作的序号：")
		fmt.Scan(&choice)
		if choice == 1 {
			deposit(balance)
		} else if choice == 2 {
			drawMoney(balance)
		} else if choice == 3 {
			viewBalance(balance)
		} else if choice == 4 {
			fmt.Println("已退出atm系统！！")
			break
		} else {
			fmt.Print("输入的操作序号不合法！！\n")
		}
	}
}

// 存钱
func deposit(balance *float64) {
	var money string
	fmt.Print("请输入你的存入金额：")
	fmt.Scan(&money)
	//如果字符串合法才进行下一步
	if islegal(money) {
		money2, _ := strconv.ParseFloat(money, 64) //将输入字符串转换为浮点数
		*balance = *balance + money2
		fmt.Printf("存款成功，余额为:%.2f\n", *balance)

	}

}

// 取钱
func drawMoney(balance *float64) {

	var money string
	fmt.Print("请输入你的取款金额：")
	fmt.Scan(&money)
	//如果字符串合法才进行下一步
	if islegal(money) {
		money2, _ := strconv.ParseFloat(money, 64) //将输入字符串转换为浮点数
		if money2 <= *balance {
			*balance = *balance - money2
			fmt.Printf("取钱成功，余额为:%.2f\n", *balance)
		} else {
			fmt.Println("取钱金额大于余额，此操作不合法！")
		}
	}
}

// 查询余额
func viewBalance(balance *float64) {
	fmt.Printf("账户余额为：%.2f\n", *balance)
}

func islegal(str string) bool {
	flag := true //是否合法的标志位
	//判断字符串中是否有空格
	if strings.Contains(str, " ") {
		fmt.Println("输入字符串不合法！！")
		flag = false
	} else {
		//判断字符串中是否有字母
		for _, i := range str {
			if (i >= 'a' && i <= 'z') || (i >= 'A' && i <= 'Z') {
				fmt.Println("输入字符串不合法！！")
				flag = false
			}
		}
	}
	money, _ := strconv.ParseFloat(str, 64) //将输入字符串转换为浮点数
	//判断输入金额是否为负数
	if money < 0 {
		flag = false
		fmt.Println("输入不合法,为负数！！")
	}
	return flag
}
